package com.youshang520i.service.impl;

import com.youshang520i.dao.StudentDao;
import com.youshang520i.dao.TeacherDao;
import com.youshang520i.model.StudentModel;
import com.youshang520i.model.TeacherModel;
import com.youshang520i.service.StudentService;
import com.youshang520i.service.TeacherService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;

import java.util.List;

/**
 * @author youshang
 */
@Service
public class StudentServiceImpl implements StudentService {

    @Autowired
    private StudentDao studentDao;
    @Autowired
    private TeacherService teacherService;
    @Autowired
    private TeacherDao teacherDao;

    @Override
    public List<StudentModel> selectStudentList() {
        return studentDao.selectStudentList();
    }

    /**
     * Propagation支持7种不同的传播机制：
     * REQUIRED：如果存在一个事务，则支持当前事务。如果没有事务则开启一个新的事务。   结果：事务生效
     * SUPPORTS： 如果存在一个事务，支持当前事务。如果没有事务，则非事务的执行。但是对于事务同步的事务管理器，SUPPORTS 与不使用事务有少许不同。    结果：事务不生效
     * NOT_SUPPORTED：总是非事务地执行，并挂起任何存在的事务。                                               结果：事务不生效
     * REQUIRES_NEW：总是开启一个新的事务。如果一个事务已经存在，则将这个存在的事务挂起。                         结果：事务生效
     * MANDATORY：如果已经存在一个事务，支持当前事务。如果没有一个活动的事务，则抛出异常。                         结果：不存在事务，直接抛异常
     * NEVER：总是非事务地执行，如果存在一个活动事务，则抛出异常                                               结果：事务不生效
     * NESTED：如果一个活动的事务存在，则运行在一个嵌套的事务中。如果没有活动事务，则按REQUIRED属性执行。            结果：事务生效
     *
     * 经过测试，事务四种情况
     * 1. (StudentServiceImpl#insert 添加 @Transactional) && (TeacherServiceImpl#insert 添加 @Transactional)
     * 2. (StudentServiceImpl#insert 不添加 @Transactional) && (TeacherServiceImpl#insert 添加 @Transactional)
     * 3. (StudentServiceImpl#insert 添加 @Transactional) && (TeacherServiceImpl#insert 不添加 @Transactional)
     * 4. (StudentServiceImpl#insert 不添加 @Transactional) && (TeacherServiceImpl#insert 不添加 @Transactional)
     *
     * @param studentModel
     * @return
     */
    @Override
    @Transactional(propagation = Propagation.REQUIRED)
    public boolean insert(StudentModel studentModel) {
//        Object savePoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint();
        int insert = 0;
        try {
            insert = studentDao.insert(studentModel);

            TeacherModel teacherModel = new TeacherModel();
            teacherModel.setTid(1);
            teacherModel.setSid(studentModel.getId());
            teacherModel.setTname("m ~");
            insert = teacherService.insert(teacherModel);
        } catch (Exception e) {
            System.out.println("发生异常,进行手动回滚！");
//            TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint);
//            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            e.printStackTrace();
            //throw new RuntimeException();
        }
        return insert > 0;
    }
}
